const express = require('express');
const fs = require('fs');
const path = require('path');
const axios = require('axios');
const { v4: uuidv4 } = require('uuid');

const app = express();
const PORT = 80;
const PRODUCT_DB_PATH = path.join(__dirname, 'product-db.json');
// 静态资源保存目录
const ASSETS_DIR = path.join(__dirname, 'static');
const IMAGES_DIR = path.join(__dirname, 'static', 'images');

// 确保assets目录存在
if (!fs.existsSync(IMAGES_DIR)) {
    fs.mkdirSync(IMAGES_DIR, { recursive: true });
}

// 中间件
app.use(express.json());
app.use('/', express.static(ASSETS_DIR));

// 读取商品数据
function readProducts() {
    const data = fs.readFileSync(PRODUCT_DB_PATH, 'utf8');
    return JSON.parse(data).products;
}

// 写入商品数据
function writeProducts(products) {
    fs.writeFileSync(PRODUCT_DB_PATH, JSON.stringify({ products }, null, 2));
}

// 查询所有商品
app.get('/api/products', (req, res) => {
    const products = readProducts();
    res.json({ code: 0, data: products });
});

// 根据条码查询商品
app.get('/api/products/:barcode', (req, res) => {
    const products = readProducts();
    const product = products.find(p => p.barcode === req.params.barcode);
    if (product) {
        res.json({ code: 0, data: product });
    } else {
        res.json({ code: 404, msg: '商品未找到' });
    }
});

// 添加商品
app.post('/api/product/add', async (req, res) => {
    const products = readProducts();
    const newProduct = req.body;
    const { barcode, name, price, image } = newProduct;

    // 验证必填字段
    if (!name || !price || !barcode || !image) {
        return res.json({ code: 1024, msg: '缺少必要字段' });
    }

    // 检查条码是否已存在
    if (products.some(p => p.barcode === barcode)) {
        return res.json({ code: 1000, msg: '商品条码已存在' });
    }

    // 如果是远程图片URL，下载并保存
    if (image.startsWith('http://') || image.startsWith('https://')) {
        const localImagePath = await downloadAndSaveImage(image);
        if (!localImagePath) {
            return res.json({ code: 1002, msg: '图片下载失败' });
        }
        newProduct.image = localImagePath;
    }

    products.push(newProduct);
    writeProducts(products);
    res.json({ code: 0, msg: '商品添加成功' });
});

// 更新商品
app.put('/api/products/:id', async (req, res) => {
    const products = readProducts();
    const index = products.findIndex(p => p.id === req.params.id);

    if (index === -1) {
        return res.json({ code: 1001, msg: '商品未找到' });
    }

    const updatedProduct = { ...products[index], ...req.body };

    // 如果图片URL是远程地址，下载并保存
    if (updatedProduct.image &&
        (updatedProduct.image.startsWith('http://') || updatedProduct.image.startsWith('https://'))) {
        const localImagePath = await downloadAndSaveImage(updatedProduct.image);
        if (localImagePath) {
            updatedProduct.image = localImagePath;
        }
    }

    products[index] = updatedProduct;
    writeProducts(products);
    res.json({ code: 0, msg: '商品更新成功' });
});

// 删除商品
app.delete('/api/products/:barcode', (req, res) => {
    const products = readProducts();
    const index = products.findIndex(p => p.barcode === req.params.barcode);

    if (index === -1) {
        return res.status(404).json({ error: '商品未找到' });
    }

    const product = products[index];
    if (product.image) {
        // 删除static目录下存储的该图片
        const imagePath = path.join(ASSETS_DIR, product.image);

        // 删除商品图片文件
        try {
            if (fs.existsSync(imagePath)) {
                fs.unlinkSync(imagePath);
            }
        } catch (err) {
            console.error('删除图片文件失败:', err);
        }
    }

    products.splice(index, 1);
    writeProducts(products);
    res.json({ code: 0, msg: '商品删除成功' });
});

// 下载并保存远程图片
async function downloadAndSaveImage(url) {
    try {
        // 使用axios获取远程图片数据，指定响应类型为arraybuffer
        const response = await axios.get(url, { responseType: 'arraybuffer' });

        // 从URL中提取文件扩展名，如果没有则默认使用.jpg
        const ext = path.extname(url) || '.jpg';

        // 生成唯一文件名（UUID + 扩展名）
        const filename = `${uuidv4()}${ext}`;

        // 拼接完整的本地文件路径
        const filePath = path.join(IMAGES_DIR, filename);

        // 将图片数据写入本地文件
        fs.writeFileSync(filePath, response.data);

        // 返回图片的本地访问路径
        return `/images/${filename}`;
    } catch (error) {
        // 捕获并打印下载错误
        console.error('下载图片失败:', error);
        return null;
    }
}




// 启动服务器
app.listen(PORT, () => {
    console.log(`服务器已启动，监听端口 ${PORT}`);
});